#pragma once
#include<iostream>
#include<string>
#include<functional>
#include<pthread.h>
#include<unistd.h>
#include"logMessage.hpp"
using std::string;
class Task{
    public:
        //使用了C++中的类型声明别名，为复杂的类型提供了一个简易的名字
        //定义了一个名为callback_t的类型别名，代表的是一个特定类型的std::function对象
        //std::function 是一个通用的多态函数封装器，可以指向任何可调用的目标。
        //表示callback_t 可以用来表示任何返回类型为 void 并接受三个参数的可调用对象。
        using callback_t=std::function<void(int,string,uint16_t)>;
        Task()//默认构造函数
            :_sock(-1)
            ,_port(-1){}
        Task(int sock,string ip,uint16_t port,callback_t func)//带参构造函数，第四个参数就是任务处理的回调函数
            :_sock(sock)
            ,_ip(ip)
            ,_port(port)
            ,_func(func){}
        void operator()(){//重载operator(),使得Task对象可以直接作为函数调用
            logMessage(DEBUG,"Thread[%p] has done %s:%d request ---start",pthread_self(),_ip.c_str(),_port);
            _func(_sock,_ip,_port);//在执行回调函数前后分别记录日志信息，显示当前线程正在处理的任务及状态
            logMessage(DEBUG,"Thread[%p] has done %s:%d request ---end",pthread_self(),_ip.c_str(),_port);
        }
        //为什么任务执行不直接在 Task 类中实现？
//解耦任务和具体逻辑：

//任务的具体逻辑可能与任务的管理逻辑无关。通过将任务逻辑委托给回调函数，可以将任务的管理（如日志记录、线程调度）与任务的执行逻辑分离，提高代码的模块化和可维护性。
//这种设计符合 单一职责原则：Task 类只负责封装任务和执行任务的框架，而具体逻辑由回调函数负责。
//灵活性和扩展性：

//通过回调函数，您可以在运行时动态指定任务的具体逻辑，而不需要修改 Task 类本身。
//例如，同一个 Task 对象可以执行不同的逻辑，只需传入不同的回调函数。
//通用性：

//这种设计使得 Task 类更加通用，可以适用于各种不同的任务场景，而不局限于特定的逻辑。
        void run(){
            (*this)();//*this代表获取 调用run()的Task对象所以（*this）()代表调用当前对象的operator()方法。
        }
    private:
        //都是与任务相关的信息（套接字、发送任务端的IP和端口号）
        int _sock;
        string _ip;
        uint16_t _port;
        callback_t _func;//保存一个回调函数，该函数将在任务执行时被调用。
};
